//
//#include "../engine.h"
//#include "../system/config.h"
//#include "game.h"
//
//
//#include <map>
//#include <math.h>
//#include <algorithm>
//#include <ctime>
//
//#include "../User.h"
//#include "../Proxy.h"
//#include "../Enum.h"
//
//#include "../NLogic/Bag.h"
//#include "../NLogic/Item.h"
//#include "../NLogic/Equip.h"
//#include "../NLogic/Battle.h"
//#include "../NLogic/Space.h"
//#include "../NLogic/SocialInfo.h"
//#include "../NLogic/Buff.h"
//
//#include "../xldata/pcnew.h"
//#include "../xldata/pcstatup.h"
//
//namespace ProjectZ { namespace NGame {
//
//void SendCharacterDefaultInfo(User *pFromUser, User *pToUser)
//{
//	/*
//	 * SC_REQ_USER_INFO_DEFAULT			0x0902
//	{
//		u32	u32gid;						//게임 유니크 Key
//		u16	u16pos_x;
//		u16	u16pos_y;
//		u16	u16degree;					//방향 벡터(보고있는 방향 0 : RIGHT, 90 : DOWN..)
//		u16	u16level;					//레벨(MAX : 99 이상 확장가능)
//		u8	u8class_type;				//클래스 타입
//
//		u16	u16main_stat_point;			//메인스탯포인트(잔여포인트)
//		u16 u16skill_point;				//스킬포인트(잔여포인트)
//		u32	u32main_stat_str;			// MainStat(근력)
//		u32	u32main_stat_dex;			// MainStat(민첩)
//		u32	u32main_stat_con;			// MainStat(체력)
//		u32	u32main_stat_spi;			// MainStat(기력)
//
//		u32	u32ext_stat_exp;			//확장효과(추가경험치 버프)
//		u32	u32ext_stat_auto_routing;	//오토루팅 시간
//		u16	u16zen_sub_stat;			//젠으로 찍은 서브스탯포인트
//		u8	u8open_active_skill_num;	// 열린 액티브 스킬 갯수 DLC이슈
//
//		u8	count   max 20 				/// 반복구 : 20회 반복
//		{
//			u16	u16skill_tid;			///	스킬  TID
//			u8	u8skill_levle;			/// 스킬 Level
//		}
//
//		str	str_slot_id;
//		u8  count 						//	반복구(13회) : 장착아이템 정보
//		{
//			u8	u8equip_pos;			//	장착위치
//			u64	item_seq;				// 아이템 seq
//			u8	cur_duration;			// 내구도 현재
//			u8	max_duration;
//			u8	stack_num;				// 스탯된 개수
//			u8	set_type				// 세트아이템타입(-1 : 없음)
//			u8	non_identity;   		// 미식별여부
//			u8	cur_refine_step;		// 현재 제련단계
//			u8	quality;
//			u8	level;
//			u8	eff_type0;
//			u8	eff_pos0;	// 기본이펙트 : 위치
//			u16	eff_value0;	// 기본이펙트 : 효과치
//			u8	eff_type1;
//			u8	eff_pos1;
//			u16	eff_value1;
//			u8	eff_type2;
//			u8	eff_pos2;
//			u16	eff_value2;
//			u8	eff_type3;
//			u8	eff_pos3;
//			u16	eff_value3;
//			u8	eff_type4;
//			u8	eff_pos4;
//			u16	eff_value4;
//			u8	eff_type5;
//			u8	eff_pos5;
//			u16	eff_value5;
//			u8	eff_type6;
//			u8	eff_pos6;
//			u16	eff_value6;
//			u8	open_upgrade_stone_slot; // 오픈된 강화석 슬롯수
//			u8	ablity_enhance_rate; 	// 기본능력치 상향
//			u8	max_enhance_step;	// 제련 최대값
//			u8	buy_use;	// 구매 후 바로 사용 여부
//			u8	evolve_step;	// 진화단계
//			u8	evolve_max; 	// 진화 최대단계
//			u16	evolve_point;	// 진화포인트
//			u16	evolve_eff;
//			u16	evolve_eff_value;	// 진화이펙트 값
//			u8	class_type;			// 장착클래스 타입
//			u8	sheet_type;			// 시트 타입
//			u16	tid;				// 테이블 아이디
//		}
//
//		/// 가중치
//		u16	u16hp_add_percent;				///  기본100 , 그외는 컨트롤
//		u16	u16attack_add_percent;			///  기본100 , 그외는 컨트롤
//
//		u16	u16my_pvp_point;		/// 내 PVP승점
//
//		u8	u8gender;					// 성별표시 0:남자, 1:여자, 2:비공개
//
//		/// 버프관련
//		count max 5
//		{
//			u8 u8type;						/// 0:승점버프, 1:친구버프, 2:참피온 버프1 , 3:참피온 버프2, 4:길드 버프
//			u16	u16skill_tid;
//			u8 u8skill_level;
//			s16	s16skill_value;				/// %
//			u16	u16skill_time;
//		}
//	}
//	 */
//	if( !pFromUser || !pToUser )
//	{
//		return;
//	}
//
////	Player_Info & from_player_info = pFromUser->player_info;
//	NLogic::Battle::Data & clsBattleData = pFromUser->GetBattle()->GetData();
//
//	NLogic::Equip * pEquip = pFromUser->GetEquip();
//	if (NULL == pEquip)
//	{
//		DEBUGLOG("SendCharacterDefaultInfo FromUser Eqip is NULL");
//		return;
//	}
//
//	int added_attack = 100;
//	int added_hp = 100;
//	int posx = clsBattleData.x;
//	int posy = clsBattleData.y;
//	int degree = clsBattleData.degree;
//
//	// PVP인 경우 HP 및 좌표 보정
//	if (NULL != pToUser->GetSpace())
//	{
//		if (pToUser->GetSpace()->GetData()._spaceType == NLogic::Space::SpaceType::PVP_USER
//				|| pToUser->GetSpace()->GetData()._spaceType == NLogic::Space::SpaceType::PVP_PRACTICE)
//		{
//			added_hp = NLogic::NFunction::GetAdjustHP_PVP(pFromUser);
//
//			// 자신의 좌표를 보고 상대의 좌표를 설정
//			if (static_cast<int>(pToUser->GetBattle()->GetData().x) == PVP_P1_START_X)
//			{
//				posx = PVP_P2_START_X;
//				posy = PVP_P2_START_Y;
//				degree = 180;
//			}
//			else
//			{
//				posx = PVP_P1_START_X;
//				posy = PVP_P1_START_Y;
//				degree = 0;
//			}
//		}
//	}
//
//	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
//	pAck->MsgCat("%d", pFromUser->GetUserSeq());
//
//	pAck->MsgCat("%2d", posx);
//	pAck->MsgCat("%2d", posy);
//	pAck->MsgCat("%2d", degree);
//	pAck->MsgCat("%2d", pFromUser->GetCharacterInfo().level);
//	pAck->MsgCat("%c", pFromUser->GetCharacterInfo().classtype);
//
//	pAck->MsgCat("%2d", pFromUser->GetCharacterInfo().remain_stat_point);
//	pAck->MsgCat("%2d", pFromUser->GetCharacterInfo().remain_skill_point);
//
//	pAck->MsgCat("%d", pFromUser->GetCharacterInfo().str);
//	pAck->MsgCat("%d", pFromUser->GetCharacterInfo().dex);
//	pAck->MsgCat("%d", pFromUser->GetCharacterInfo().con);
//	pAck->MsgCat("%d", pFromUser->GetCharacterInfo().spi);
//
//	pAck->MsgCat("%d", 0);		// 확장효과(추가 경험치 버프)
//	pAck->MsgCat("%d", 0);		// 오토루팅 시간
//	pAck->MsgCat("%2d", 0);		// 젠으로 찍은 서브스탯포인트
//	pAck->MsgCat("%c", 0);		// 열린 액티브 스킬 갯수 DLC이슈
//
//	pAck->MsgCat("%c", MAX_SKILL);	// skill count
//	for( int i=0 ; i<MAX_SKILL ; i++ )
//	{
//		pAck->MsgCat("%2d", i+(pFromUser->GetCharacterInfo().classtype*MAX_SKILL));
//		pAck->MsgCat("%c", pFromUser->GetCharacterInfo().array_Skill[i]);
//	}
//	pAck->MsgCat("%s", pFromUser->GetUserInfo().nickname.c_str());
//	pAck->MsgCat("%c", pEquip->HasItemCount());
//
//	for(int i = 0; i < static_cast<int>(MAX_ITEM_EQUIP_POS); ++i)
//	{
//		NLogic::Item * pItem = pEquip->GetItem(static_cast<EnumItemEquipPosition>(i));
//		if (NULL != pItem)
//		{
//			pAck->MsgCat("%c", pItem->GetEquipPos());
//			pAck->MsgCat("%8d", pItem->GetItemSeq());
//
//			pItem->WriteToPacket(pAck);
//		}
//	}
//
//	pAck->MsgCat("%2d", added_hp);
//	pAck->MsgCat("%2d", added_attack);
//
//	int gender = 2;
//	if(pToUser->GetSocialInfo()->GetData()->_isGenderOpen)
//		gender = pToUser->GetSocialInfo()->GetData()->_gender;
//	pAck->MsgCat("%2d%c", pToUser->GetUserInfo().wp_cur_week, gender);		// FIXME: 내PVP승점, 성별
//
//
//	// buff
////	pAck->MsgCat("%c", 0);
//	NLogic::Buff * pBuff = pToUser->GetBuff();
//	if (NULL == pBuff)
//	{
//		DEBUGLOG("CS_REQ_SKILL_BUFF NULL == pBuff");
//		return;
//	}
//
//	* pAck << static_cast<uint8_t>(pBuff->GetDataVector().size());
//	std::time_t t = std::time(0);  // t is an integer type
//	unsigned int nTime = t;
//	std::for_each(pBuff->GetDataVector().begin(), pBuff->GetDataVector().end(), [&](NLogic::Buff::Data * pData) {
//
//		if (pData->_regdate < nTime)
//		{
//			pData->Clear();
//
//			* pAck << static_cast<uint8_t>(pData->u8type);
//			* pAck << static_cast<uint16_t>(pData->u16skill_tid);
//			* pAck << static_cast<uint8_t>(pData->u8skill_level);
//			* pAck << static_cast<uint16_t>(pData->s16skill_value);
//			* pAck << static_cast<uint16_t>(pData->_regdate);
//		}
//		else
//		{
//			* pAck << static_cast<uint8_t>(pData->u8type);
//			* pAck << static_cast<uint16_t>(pData->u16skill_tid);
//			* pAck << static_cast<uint8_t>(pData->u8skill_level);
//			* pAck << static_cast<uint16_t>(pData->s16skill_value);
//			* pAck << static_cast<uint16_t>(pData->_regdate - nTime);
//		}
//	} );
//
//	pAck->MakePacket(CMD_SC_REQ_USER_INFO_DEFAULT);
//	pToUser->Send(pAck);
//
//	DEBUGLOG("	##### SendCharacterDefaultInfo : MySeq=%d, OppSeq=%d", pToUser->GetUserSeq(), pFromUser->GetUserSeq());
//}
//
//void SendCharacterEquipInfo(User *pFromUser, User *pToUser)
//{
//	if( !pFromUser || !pToUser )
//	{
//		DEBUGLOG("%s:ERROR: invalud user", __func__ );
//		return;
//	}
//
//	NLogic::Equip * pEquip = pFromUser->GetEquip();
//	if (NULL == pEquip)
//	{
//		DEBUGLOG("SendCharacterEquipInfo FromUser Eqip is NULL");
//		return;
//	}
//
//	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
//	pAck->MsgCat("%d", pFromUser->GetUserSeq());
//	pAck->MsgCat("%c", pEquip->HasItemCount());
//
//	for(int i = 0; i < static_cast<int>(MAX_ITEM_EQUIP_POS); ++i)
//	{
//		NLogic::Item * pItem = pEquip->GetItem(static_cast<EnumItemEquipPosition>(i));
//		if (NULL != pItem)
//		{
//			pAck->MsgCat("%c", pItem->GetEquipPos());
//			pAck->MsgCat("%8d", pItem->GetItemSeq());
//
//			pItem->WriteToPacket(pAck);
//		}
//	}
//
//	pAck->MakePacket(CMD_SC_REQ_USER_INFO_EQUIPED);
//	pToUser->Send(pAck);
//
//	DEBUGLOG("	##### SendCharacterEquipInfo : MySeq=%d, OppSeq=%d", pToUser->GetUserSeq(), pFromUser->GetUserSeq());
//}
//
//void SendCharacterFairyInfo(User *pFromUser, User *pToUser)
//{
//	if( !pFromUser || !pToUser )
//	{
//		DEBUGLOG("%s:ERROR: invalud user", __func__ );
//		return;
//	}
//
//	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
//
//	pAck->MsgCat("%d", pFromUser->GetUserSeq());
//
//	pAck->MsgCat("%c", 0);
//
//	pAck->MsgCat("%c", 0);
//	pAck->MsgCat("%c", 0);
//	pAck->MsgCat("%c", 0);
//	pAck->MsgCat("%c", 1);
//
//	pAck->MsgCat("%c", 0);
//
//	pAck->MsgCat("%d", 0);
//	pAck->MsgCat("%d", 0);
//	pAck->MsgCat("%c", 0);
//
//	pAck->MakePacket(CMD_SC_REQ_USER_INFO_FAIRY);
//	pToUser->Send(pAck);
//
//	DEBUGLOG("	##### SendCharacterFairyInfo : MySeq=%d, OppSeq=%d", pToUser->GetUserSeq(), pFromUser->GetUserSeq());
////	::Logger::GETLOG()->ToFile(::Logger::DEBUG, "%s: send fairy info, from gid %d, to gid %d", __func__, pFromUser->GetGID(), pToUser->GetGID());
//}
//
//void SendCharacterInvenBagInfo(User *pFromUser, User *pToUser, int bag_type)
//{
//	if( !pFromUser || !pToUser )
//	{
//		DEBUGLOG("%s:ERROR: invalud user", __func__ );
//		return;
//	}
//
//	NLogic::Bag * pBag = pFromUser->GetBag(static_cast<INVEN_BAG_TYPE>(bag_type));
//	if (NULL == pBag)
//		return;
//
//	int count = pBag->HasItemCount();
//
//	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
//	pAck->MsgCat("%d%c", pFromUser->GetUserSeq(), bag_type);
//	pAck->MsgCat("%c", count);
//
//	NLogic::Bag::ITEMVECTOR & clsItemVector = pBag->GetItemVector();
//	std::for_each(clsItemVector.begin(), clsItemVector.end(), [&](NLogic::Item * pItem) {
//		if (NULL != pItem){
//			pAck->MsgCat("%c", pItem->GetData().bag_slot_number);
//			pAck->MsgCat("%8d", pItem->GetItemSeq());
//
//			pItem->WriteToPacket(pAck);
//		}
//	} );
//
//	pAck->MakePacket(CMD_SC_REQ_USER_INFO_INVEN_BAG);
//	pToUser->Send(pAck);
//
//}
//
//void SendCharacterInfo(User *pFromUser, User *pToUser)
//{
//	//if( pToUser->player_info.Locate == PL_TOWN )
//	if( pToUser->GetSpace()->GetData()._spaceType == NLogic::Space::SpaceType::WORLD )
//	{
//		SendCharacterInfoSimple(pFromUser, pToUser);
//	}
//	else
//	{
//		SendCharacterDefaultInfo(pFromUser, pToUser);
//		//SendCharacterFairyInfo(pFromUser, pToUser);
//		SendCharacterEquipInfo(pFromUser, pToUser);
//	}
//}
//
//void SendCharacterInfoSimple(User *pFromUser, User *pToUser)
//{
//	if( !pFromUser || !pToUser )
//	{
//		DEBUGLOG("%s:ERROR: invalud user", __func__ );
//		return;
//	}
//
//	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
//	pAck->MsgCat("%d", pFromUser->GetUserSeq());
//	pAck->MsgCat("%2d", pFromUser->GetBattle()->GetData().x);
//	pAck->MsgCat("%2d", pFromUser->GetBattle()->GetData().y);
//	pAck->MsgCat("%2d", pFromUser->GetBattle()->GetData().degree);
//	pAck->MsgCat("%2d", pFromUser->GetCharacterInfo().level);
//	pAck->MsgCat("%c", pFromUser->GetCharacterInfo().classtype);
//	//pAck->MsgCat("%s", pFromUser->nickname);
//
//	if(1 == pFromUser->GetSocialInfo()->GetData()->_profile_opened)
//	{
//		if (81 <= pFromUser->GetUserInfo().nickname.size())
//		{
//			DEBUGLOG("SendCharacterInfoSimple user nick : %s", pFromUser->GetUserInfo().nickname.c_str());
//			pAck->MsgCat("%s", "none");
//		}
//		else
//		{
//			pAck->MsgCat("%s", pFromUser->GetUserInfo().nickname.c_str());
//		}
//	}
//	else
//		pAck->MsgCat("%2d", 0);
//
//	pAck->MsgCat("%c", pFromUser->GetBattle()->GetData().vehicle_state);
//
//	if (pFromUser->GetCharacterInfo().avartar_iconidx == 1000)
//	{
//		pAck->MsgCat("%c", pFromUser->GetCharacterInfo().helmet_iconidx);
//		pAck->MsgCat("%c", pFromUser->GetCharacterInfo().armor_iconidx);
//		pAck->MsgCat("%c", pFromUser->GetCharacterInfo().weapon_iconidx);
//		pAck->MsgCat("%c", pFromUser->GetCharacterInfo().weapon_iconidx);
//	}
//	else
//	{
//		pAck->MsgCat("%c", pFromUser->GetCharacterInfo().avartar_iconidx + 100);
//		pAck->MsgCat("%c", pFromUser->GetCharacterInfo().avartar_iconidx + 100);
//		pAck->MsgCat("%c", pFromUser->GetCharacterInfo().avartar_iconidx + 100);
//		pAck->MsgCat("%c", pFromUser->GetCharacterInfo().avartar_iconidx + 100);
//	}
//	pAck->MsgCat("%c", 0);	//u8	u8costume_effect;
//	pAck->MsgCat("%c", pFromUser->GetCharacterInfo().vehicle_iconidx);
//
//	///
//	pAck->MsgCat("%c", 0);
//	pAck->MsgCat("%c", 0);
//	pAck->MsgCat("%2d", 0);
//
//	///
//	pAck->MsgCat("%2d", 0);
//
//	int gender = 2;
//	if(pFromUser->GetSocialInfo()->GetData()->_isGenderOpen)
//		gender = pFromUser->GetSocialInfo()->GetData()->_gender;
//	pAck->MsgCat("%c", gender);		// 성별
//
//	pAck->MsgCat("%s", pFromUser->GetSocialInfo()->GetData()->_birthday.c_str());
//	pAck->MsgCat("%c", pFromUser->GetSocialInfo()->GetData()->_isBirthdayOpen);
//
//	pAck->MakePacket(CMD_SC_REQ_OPP_USER_INFO_DEFAULT_VILLAGE);
//	pToUser->Send(pAck);
//}
//
//void SendAICharacterDefaultInfo(User * pFromUser, User *pToUser)
//{
//	/*
//	 * SC_REQ_USER_INFO_DEFAULT			0x0902
//	{
//		u32	u32gid;						//게임 유니크 Key
//		u16	u16pos_x;
//		u16	u16pos_y;
//		u16	u16degree;					//방향 벡터(보고있는 방향 0 : RIGHT, 90 : DOWN..)
//		u16	u16level;					//레벨(MAX : 99 이상 확장가능)
//		u8	u8class_type;				//클래스 타입
//
//		u16	u16main_stat_point;			//메인스탯포인트(잔여포인트)
//		u16 u16skill_point;				//스킬포인트(잔여포인트)
//		u32	u32main_stat_str;			// MainStat(근력)
//		u32	u32main_stat_dex;			// MainStat(민첩)
//		u32	u32main_stat_con;			// MainStat(체력)
//		u32	u32main_stat_spi;			// MainStat(기력)
//
//		u32	u32ext_stat_exp;			//확장효과(추가경험치 버프)
//		u32	u32ext_stat_auto_routing;	//오토루팅 시간
//		u16	u16zen_sub_stat;			//젠으로 찍은 서브스탯포인트
//		u8	u8open_active_skill_num;	// 열린 액티브 스킬 갯수 DLC이슈
//
//		u8	count   max 20 				/// 반복구 : 20회 반복
//		{
//			u16	u16skill_tid;			///	스킬  TID
//			u8	u8skill_levle;			/// 스킬 Level
//		}
//
//		str	str_slot_id;
//		u8  count 						//	반복구(13회) : 장착아이템 정보
//		{
//			u8	u8equip_pos;			//	장착위치
//			u64	item_seq;				// 아이템 seq
//			u8	cur_duration;			// 내구도 현재
//			u8	max_duration;
//			u8	stack_num;				// 스탯된 개수
//			u8	set_type				// 세트아이템타입(-1 : 없음)
//			u8	non_identity;   		// 미식별여부
//			u8	cur_refine_step;		// 현재 제련단계
//			u8	quality;
//			u8	level;
//			u8	eff_type0;
//			u8	eff_pos0;	// 기본이펙트 : 위치
//			u16	eff_value0;	// 기본이펙트 : 효과치
//			u8	eff_type1;
//			u8	eff_pos1;
//			u16	eff_value1;
//			u8	eff_type2;
//			u8	eff_pos2;
//			u16	eff_value2;
//			u8	eff_type3;
//			u8	eff_pos3;
//			u16	eff_value3;
//			u8	eff_type4;
//			u8	eff_pos4;
//			u16	eff_value4;
//			u8	eff_type5;
//			u8	eff_pos5;
//			u16	eff_value5;
//			u8	eff_type6;
//			u8	eff_pos6;
//			u16	eff_value6;
//			u8	open_upgrade_stone_slot; // 오픈된 강화석 슬롯수
//			u8	ablity_enhance_rate; 	// 기본능력치 상향
//			u8	max_enhance_step;	// 제련 최대값
//			u8	buy_use;	// 구매 후 바로 사용 여부
//			u8	evolve_step;	// 진화단계
//			u8	evolve_max; 	// 진화 최대단계
//			u16	evolve_point;	// 진화포인트
//			u16	evolve_eff;
//			u16	evolve_eff_value;	// 진화이펙트 값
//			u8	class_type;			// 장착클래스 타입
//			u8	sheet_type;			// 시트 타입
//			u16	tid;				// 테이블 아이디
//		}
//
//		/// 가중치
//		u16	u16hp_add_percent;				///  기본100 , 그외는 컨트롤
//		u16	u16attack_add_percent;			///  기본100 , 그외는 컨트롤
//
//		u16	u16my_pvp_point;		/// 내 PVP승점
//
//		u8	u8gender;					// 성별표시 0:남자, 1:여자, 2:비공개
//
//		/// 버프관련
//		count max 5
//		{
//			u8 u8type;						/// 0:승점버프, 1:친구버프, 2:참피온 버프1 , 3:참피온 버프2, 4:길드 버프
//			u16	u16skill_tid;
//			u8 u8skill_level;
//			s16	s16skill_value;				/// %
//			u16	u16skill_time;
//		}
//	}
//	 */
//	if( !pFromUser || !pToUser )
//	{
//		return;
//	}
//
//	NLogic::Equip * pEquip = pFromUser->GetEquip();
//	if (NULL == pEquip)
//	{
//		DEBUGLOG("SendCharacterDefaultInfo FromUser Eqip is NULL");
//		return;
//	}
//
//	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
//
//	if (true == pToUser->GetSpace()->GetData()._bPVPDummyUser)
//		pAck->MsgCat("%4d", 0);
//	else
//		pAck->MsgCat("%4d", pFromUser->GetUserInfo().userseq);
//
//	pAck->MsgCat("%2d", PVP_P2_START_X);	// PVP X축
//	pAck->MsgCat("%2d", PVP_P2_START_Y);	// PVP Y축
//	pAck->MsgCat("%2d", 180);				// PVP Dgree
//	pAck->MsgCat("%2d", pFromUser->GetCharacterInfo().level);
//	pAck->MsgCat("%c", pFromUser->GetCharacterInfo().classtype);
//
//	pAck->MsgCat("%2d", pFromUser->GetCharacterInfo().remain_stat_point);
//	pAck->MsgCat("%2d", pFromUser->GetCharacterInfo().remain_skill_point);
//
//	pAck->MsgCat("%d", pFromUser->GetCharacterInfo().str);
//	pAck->MsgCat("%d", pFromUser->GetCharacterInfo().dex);
//	pAck->MsgCat("%d", pFromUser->GetCharacterInfo().con);
//	pAck->MsgCat("%d", pFromUser->GetCharacterInfo().spi);
//
//	pAck->MsgCat("%d", 0);		// 확장효과(추가 경험치 버프)
//	pAck->MsgCat("%d", 0);		// 오토루팅 시간
//	pAck->MsgCat("%2d", 0);		// 젠으로 찍은 서브스탯포인트
//	pAck->MsgCat("%c", 0);		// 열린 액티브 스킬 갯수 DLC이슈
//
//	pAck->MsgCat("%c", MAX_SKILL);	// skill count
//	for( int i=0 ; i<MAX_SKILL ; i++ )
//	{
//		pAck->MsgCat("%2d", i+(pFromUser->GetCharacterInfo().classtype*MAX_SKILL));
//		pAck->MsgCat("%c", pFromUser->GetCharacterInfo().array_Skill[i]);
//	}
//	pAck->MsgCat("%s", pFromUser->GetUserInfo().nickname.c_str());
//	pAck->MsgCat("%c", pEquip->HasItemCount());
//
//	for(int i = 0; i < static_cast<int>(MAX_ITEM_EQUIP_POS); ++i)
//	{
//		NLogic::Item * pItem = pEquip->GetItem(static_cast<EnumItemEquipPosition>(i));
//		if (NULL != pItem)
//		{
//			pAck->MsgCat("%c", pItem->GetEquipPos());
//			pAck->MsgCat("%8d", pItem->GetItemSeq());
//
//			pItem->WriteToPacket(pAck);
//		}
//	}
//
//	int added_hp = 100;
//	int added_attack = 100;
//
//	// PVP인 경우 HP 보정
//	if (pToUser->GetSpace()->GetData()._spaceType == NLogic::Space::SpaceType::PVP_PRACTICE)
//	{
//		added_hp = NLogic::NFunction::GetAdjustHP_PVP(pFromUser);
//	}
//
//	pAck->MsgCat("%2d", added_hp);	// Add HP
//	pAck->MsgCat("%2d", added_attack);	// Add Attack
//
////	pAck->MsgCat("%2d%c", pToUser->GetUserInfo().wp_cur_week, rand()%3);		// FIXME: 내PVP승점, 성별
//	int gender = 2;
//	if(pToUser->GetSocialInfo()->GetData()->_isGenderOpen)
//		gender = pToUser->GetSocialInfo()->GetData()->_gender;
//
//	pAck->MsgCat("%2d%c", pToUser->GetUserInfo().wp_cur_week, gender);		// FIXME: 내PVP승점, 성별
//
//	// buff
//	pAck->MsgCat("%c", 0);
//
//	pAck->MakePacket(CMD_SC_REQ_USER_INFO_DEFAULT);
//	pToUser->Send(pAck);
//
//	DEBUGLOG("	##### SendAICharacterDefaultInfo : MySeq=%d, OppSeq=%d", pToUser->GetUserSeq(), pFromUser->GetUserSeq());
//}
//
//void SendAICharacterEquipInfo(User *pFromUser, User *pToUser)
//{
//	if( !pFromUser || !pToUser )
//	{
//		DEBUGLOG("%s:ERROR: invalud user", __func__ );
//		return;
//	}
//
//	NLogic::Equip * pEquip = pFromUser->GetEquip();
//	if (NULL == pEquip)
//	{
//		DEBUGLOG("SendCharacterEquipInfo FromUser Eqip is NULL");
//		return;
//	}
//
//	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
//
//	if (true == pToUser->GetSpace()->GetData()._bPVPDummyUser)
//		pAck->MsgCat("%4d", 0);
//	else
//		pAck->MsgCat("%4d", pFromUser->GetUserInfo().userseq);
//
//	pAck->MsgCat("%c", pEquip->HasItemCount());
//
//	for(int i = 0; i < static_cast<int>(MAX_ITEM_EQUIP_POS); ++i)
//	{
//		NLogic::Item * pItem = pEquip->GetItem(static_cast<EnumItemEquipPosition>(i));
//		if (NULL != pItem)
//		{
//			pAck->MsgCat("%c", pItem->GetEquipPos());
//			pAck->MsgCat("%8d", pItem->GetItemSeq());
//
//			pItem->WriteToPacket(pAck);
//		}
//	}
//
//	pAck->MakePacket(CMD_SC_REQ_USER_INFO_EQUIPED);
//	pToUser->Send(pAck);
//
//	DEBUGLOG("	##### SendAICharacterEquipInfo : MySeq=%d, OppSeq=%d", pToUser->GetUserSeq(), pFromUser->GetUserSeq());
//}
//
////void SendAICharacterFairyInfo(int slot_seq, User *pToUser)
////{
////	if( pToUser == NULL )
////	{
////		::Logger::GETLOG()->ToFile(::Logger::DEBUG, "%s:ERROR: invalud user", __func__ );
////		return;
////	}
////
////	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
////
////	pAck->MsgCat("%d", -1);
////
////	pAck->MsgCat("%c", 0);
////
////	pAck->MsgCat("%c", 0);
////	pAck->MsgCat("%c", 0);
////	pAck->MsgCat("%c", 0);
////	pAck->MsgCat("%c", 1);
////
////	pAck->MsgCat("%c", 0);
////
////	pAck->MsgCat("%d", 0);
////	pAck->MsgCat("%d", 0);
////	pAck->MsgCat("%c", 0);
////
////	pAck->MakePacket(CMD_SC_REQ_USER_INFO_FAIRY);
////	pToUser->Send(pAck);
////
////	::Logger::GETLOG()->ToFile(::Logger::DEBUG, "%s: send fairy info, to gid %d", __func__, pToUser->GetGID());
////}
//
//void SendAICharacterQuickSlotInfo(User * pFromUser, User * pToUser)
//{
//	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
//
//	if (true == pToUser->GetSpace()->GetData()._bPVPDummyUser)
//		pAck->MsgCat("%4d", 0);
//	else
//		pAck->MsgCat("%4d", pFromUser->GetUserInfo().userseq);
//
//	pAck->MsgCat("%c", 8);
//
//	for( int i=0 ; i<8 ; i++ )
//	{
//		pAck->Write1(i);
//		pAck->Write1(pFromUser->GetCharacterInfo().array_QuickSlot[i].type);
//		pAck->MsgCat("%8d", pFromUser->GetCharacterInfo().array_QuickSlot[i].index);
//	}
//	pAck->MakePacket(CMD_SC_REQ_USER_INFO_QUICKSLOT);
//	pToUser->Send(pAck);
//
//	DEBUGLOG("	##### SendAICharacterQuickSlotInfo : MySeq=%d, OppSeq=%d", pToUser->GetUserSeq(), pFromUser->GetUserSeq());
//}
//
////int GamevilSendMail(User *pUser, int receiver_gid, long long item_seq, int item_count, const char *message, const int gold, const int zen)
////{
////	return -1;
////}
////
////int SendMail(User *pUser, int receiver_gid, long long item_seq, int item_count, const char *message, const int gold, const int zen)
////{
////	return 0;
////}
////
////int SendMail(int item_table_index, int sender_gid, int receiver_gid, long long item_seq, int item_count, const char* sender_nickname, const char* receiver_nickname, const char *message, const int gold, const int zen)
////{
////	return -1;
////}
//
//
////int GetIncreaseStat(User *pUser, ESTATNAME statname)
////{
////	int class_type = pUser->GetCharacterInfo().classtype;
////	int level = pUser->GetCharacterInfo().level;
////	int needvalue = 0;
////
////	switch( statname )
////	{
////	case STAT_STR:	needvalue = NXLData::stPcnew_Pcnew[class_type].STR_UP;	break;
////	case STAT_DEX:	needvalue = NXLData::stPcnew_Pcnew[class_type].DEX_UP;	break;
////	case STAT_CON:	needvalue = NXLData::stPcnew_Pcnew[class_type].CON_UP;	break;
////	case STAT_SPI:	needvalue = NXLData::stPcnew_Pcnew[class_type].SPI_UP;	break;
////	default:	return 0;
////	}
////
////	int ret = 0;
////	if( level > 1 )
////		ret = ( ( (level-1) % needvalue ) == 0 );
////
////	DEBUGLOG("%s: level=%d, statname=%d, ret=%d", __func__, level, statname, ret);
////
////	return ret;
////}
//
//
//
//int GetMaxHP(User * pUser)
//{
//	int item_hp_sum		= 0;
//	for (int i = 0; i < MAX_ITEM_EQUIP_POS; ++i)
//	{
//		NLogic::Item * pItem = pUser->GetEquip()->GetItem(static_cast<EnumItemEquipPosition>(i));
//		if (NULL == pItem)
//			continue;
//
//		if (pItem->GetData().eff_type[0] != ITEM_EFFECT_MAX_HP)
//			continue;
//
//		item_hp_sum += pItem->GetData().eff_value[0];
//	}
//
//	int class_type = pUser->GetCharacterInfo().classtype;
//	int stat_con = pUser->GetCharacterInfo().con;
//
//	int hp_constant = 0;
//
//	switch (class_type)
//	{
//	case CLASS_TYPE_SLASHER:
//		hp_constant = NXLData::stPcstatup_Pcstatup[CLASS0_MAX_HP].CON6;
//		break;
//	case CLASS_TYPE_RANGER:
//		hp_constant = NXLData::stPcstatup_Pcstatup[CLASS1_MAX_HP].CON6;
//		break;
//	case CLASS_TYPE_FIGHTER:
//		hp_constant = NXLData::stPcstatup_Pcstatup[CLASS2_MAX_HP].CON6;
//		break;
//	case CLASS_TYPE_MAGICIAN:
//		hp_constant = NXLData::stPcstatup_Pcstatup[CLASS3_MAX_HP].CON6;
//		break;
//	case CLASS_TYPE_ASSASSIN:
//		hp_constant = NXLData::stPcstatup_Pcstatup[CLASS4_MAX_HP].CON6;
//		break;
//	}
//
//	return (stat_con * hp_constant) + item_hp_sum;
//}
//
//int GetMaxSP(User * pUser)
//{
//	int item_sp_sum		= 0;
//	for (int i = 0; i < MAX_ITEM_EQUIP_POS; ++i)
//	{
//		NLogic::Item * pItem = pUser->GetEquip()->GetItem(static_cast<EnumItemEquipPosition>(i));
//		if (NULL == pItem)
//			continue;
//
//		if (pItem->GetData().eff_type[0] != ITEM_EFFECT_MAX_SP)
//			continue;
//
//		item_sp_sum += pItem->GetData().eff_value[0];
//	}
//
//	int class_type = pUser->GetCharacterInfo().classtype;
//	int stat_spi = pUser->GetCharacterInfo().spi;
//
//	int sp_constant = 0;
//
//	switch (class_type)
//	{
//	case CLASS_TYPE_SLASHER:
//		sp_constant = NXLData::stPcstatup_Pcstatup[CLASS0_MAX_SP].SPI7;
//		break;
//	case CLASS_TYPE_RANGER:
//		sp_constant = NXLData::stPcstatup_Pcstatup[CLASS1_MAX_SP].SPI7;
//		break;
//	case CLASS_TYPE_FIGHTER:
//		sp_constant = NXLData::stPcstatup_Pcstatup[CLASS2_MAX_SP].SPI7;
//		break;
//	case CLASS_TYPE_MAGICIAN:
//		sp_constant = NXLData::stPcstatup_Pcstatup[CLASS3_MAX_SP].SPI7;
//		break;
//	case CLASS_TYPE_ASSASSIN:
//		sp_constant = NXLData::stPcstatup_Pcstatup[CLASS4_MAX_SP].SPI7;
//		break;
//	}
//
//	return (stat_spi * sp_constant) + item_sp_sum;
//}
//
//void SendCharacterDetailInfo(int fromgid, User *pToUser)
//{
//	if( !pToUser )
//	{
//		DEBUGLOG("%s:ERROR: invalud user", __func__ );
//		return;
//	}
//
//	User * pFrom = ::ProjectZ::NProxy::GetUser(fromgid);
//	if (NULL == pFrom)
//		return;
//
//	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
//	pAck->MsgCat("%2d", pFrom->GetCharacterInfo().level);
//	pAck->MsgCat("%d", pFrom->GetCharacterInfo().str);
//	pAck->MsgCat("%d", pFrom->GetCharacterInfo().dex);
//	pAck->MsgCat("%d", pFrom->GetCharacterInfo().con);
//	pAck->MsgCat("%d", pFrom->GetCharacterInfo().spi);
//
//
//	pAck->MsgCat("%c%c", 0, MAX_SKILL);	// skill count
//	for( int i=0 ; i<MAX_SKILL ; i++ )
//	{
//		pAck->MsgCat("%2d", i+(pFrom->GetCharacterInfo().classtype * MAX_SKILL));
//		pAck->MsgCat("%c", pFrom->GetCharacterInfo().array_Skill[i]);	// skill cooltime count
//	}
//
//	NLogic::Equip * pEquip = pFrom->GetEquip();
//	if (NULL == pEquip)
//	{
//		DEBUGLOG("SendCharacterEquipInfo FromUser Eqip is NULL");
//		return;
//	}
//
//	pAck->MsgCat("%c", pEquip->HasItemCount());
//	for(int i = 0; i < static_cast<int>(MAX_ITEM_EQUIP_POS); ++i)
//	{
//		NLogic::Item * pItem = pEquip->GetItem(static_cast<EnumItemEquipPosition>(i));
//		if (NULL != pItem)
//		{
//			pAck->MsgCat("%c", pItem->GetEquipPos());
//			pAck->MsgCat("%8d", pItem->GetItemSeq());
//
//			pItem->WriteToPacket(pAck);
//		}
//	}
//	pAck->MakePacket(CMD_SC_REQ_USER_INFO_DETAIL);
//
//	pToUser->Send(pAck);
//}
//
//int GetBattlePetTID(int gid, int slot_seq)
//{
//	return 0;
//}
//
//} /* NGame */ } /*ProjectZ*/
//
//
//
